package net.blank.functionUtl
{
	import flash.utils.Dictionary;

	/**
	 * 函数绑定器
	 * @author blank
	 * 
	 */
	public class FunctionBinder
	{
		/**
		 * 存储绑定函数的hash表
		 */
		private static const FUNC_HASH:Dictionary=new Dictionary();
		
		/**
		 * 添加对函数的绑定(约定:可进行绑定的函数以set和get开头成队出现,只能对set开始的函数进行绑定)
		 * @param bindingFun 被绑定函数
		 * @param callbackFun 回调函数
		 * 
		 */
		public static function addBindingFun(bindingFun:Function,callbackFun:Function):void{
			var execFuns:ExecFunctions=FUNC_HASH[bindingFun] || (FUNC_HASH[bindingFun]=new ExecFunctions());
			execFuns.addFunc(callbackFun);
		}
		
		/**
		 * 移除绑定函数
		 * @param bindingFun 被绑定函数
		 * @param callbackFun 回调函数,不指定此参数或为null时,清除 bindingFun 下的所有回调函数
		 * 
		 */
		public static function rmBindingFun(bindingFun:Function,callbackFun:Function=null):void{
			var execFuns:ExecFunctions=FUNC_HASH[bindingFun];
			if(execFuns){
				if(callbackFun != null){
					execFuns.removeFunc(callbackFun);
					if(execFuns.numFunc < 1){
						delete FUNC_HASH[bindingFun];
					}
				}else{
					delete FUNC_HASH[bindingFun];
				}
			}
		}
		
		/**
		 * 清除列表中的被绑定函数
		 * @param funs 被绑定函数列表
		 * 
		 */
		public static function clearBindingFuns(...funs):void{
			for each(var fun:Function in funs){
				rmBindingFun(fun);
			}
		}
		
		/**
		 * 执行回调函数
		 * @param bindingFun 被绑定函数
		 * @param args 函数参数
		 * 
		 */
		public static function execCallbackFun(bindingFun:Function,args:Array=null):void{
			var execFuns:ExecFunctions=FUNC_HASH[bindingFun];
			if(execFuns){
				execFuns.exec_varArgs(null,args);
			}
		}
	}
}